home *** CD-ROM | disk | FTP | other *** search
/ Programming an RTS Game with Direct3D / Programming an RTS Game with Direct3D.iso / Examples / Chapter 5 / Example 5.5 / object.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2006-06-29  |  5.5 KB  |  144 lines

  1. #include "object.h"
  2.  
  3. std::vector<MESH*> objectMeshes;
  4. ID3DXLine *line = NULL;
  5.  
  6. HRESULT LoadObjectResources(IDirect3DDevice9* Device)
  7. {
  8.     MESH *f1a = new MESH("objects/f1a.x", Device);
  9.     objectMeshes.push_back(f1a);
  10.  
  11.     MESH *f1b = new MESH("objects/f1b.x", Device);
  12.     objectMeshes.push_back(f1b);
  13.  
  14.     D3DXCreateLine(Device, &line);
  15.  
  16.     return S_OK;
  17. }
  18.  
  19. void UnloadObjectResources()
  20. {
  21.     for(int i=0;i<objectMeshes.size();i++)
  22.         objectMeshes[i]->Release();
  23.  
  24.     objectMeshes.clear();
  25.  
  26.     line->Release();
  27. }
  28.  
  29. //////////////////////////////////////////////////////////////////////////////
  30. //                            OBJECT CLASS                                    //
  31. //////////////////////////////////////////////////////////////////////////////
  32.  
  33. OBJECT::OBJECT()
  34. {
  35.     m_type = 0;
  36. }
  37.  
  38. OBJECT::OBJECT(int t, D3DXVECTOR3 pos, D3DXVECTOR3 rot, float off)
  39. {
  40.     m_type = t;
  41.     m_meshInstance.SetPosition(pos);
  42.     m_meshInstance.SetRotation(rot);
  43.     m_meshInstance.SetScale(D3DXVECTOR3(1.0f, 1.0f, 1.0f));
  44.     m_meshInstance.SetMesh(objectMeshes[m_type]);
  45.  
  46.     m_prc = 0.0f;
  47.     m_speed = 30.0f;
  48.     m_activeWP = 0;
  49.     m_nextWP = m_activeWP + 1;
  50.     m_offset = off;
  51.  
  52.     //Add cameras
  53.     m_activeCam = 0;
  54.     m_cameras.push_back(CAMERA());
  55.     m_cameras.push_back(CAMERA());
  56.     m_cameras.push_back(CAMERA());
  57.     
  58.     for(int c=0;c<m_cameras.size();c++)
  59.         m_cameras[c].Init(m_meshInstance.m_pMesh->m_pDevice);
  60. }
  61.  
  62. D3DXVECTOR2 wayPoints[] = {D3DXVECTOR2(0.05f, -1.054f), D3DXVECTOR2(76.839f, -3.446f), D3DXVECTOR2(85.238f, -4.87f), D3DXVECTOR2(92.321f, -9.393f),
  63.                            D3DXVECTOR2(95.897f, -16.917f), D3DXVECTOR2(95.33f, -25.371f), D3DXVECTOR2(93.056f, -33.568f), D3DXVECTOR2(66.702f, -105.733f),
  64.                            D3DXVECTOR2(61.049f, -112.011f), D3DXVECTOR2(54.085f, -116.594f), D3DXVECTOR2(46.065f, -119.516f), D3DXVECTOR2(37.617f, -120.27f),
  65.                            D3DXVECTOR2(-64.766f, -117.602f), D3DXVECTOR2(-73.053f, -115.573f), D3DXVECTOR2(-80.386f, -111.628f), D3DXVECTOR2(-86.758f, -105.98f),
  66.                            D3DXVECTOR2(-130.339f, -53.405f), D3DXVECTOR2(-135.042f, -46.442f), D3DXVECTOR2(-137.235f, -38.218f), D3DXVECTOR2(-136.028f, -29.767f),
  67.                            D3DXVECTOR2(-131.556f, -22.549f), D3DXVECTOR2(-124.52f, -18.613f), D3DXVECTOR2(-116.265f, -16.981f), D3DXVECTOR2(-107.82f, -18.225f),
  68.                            D3DXVECTOR2(-100.507f, -22.037f), D3DXVECTOR2(-94.091f, -27.636f), D3DXVECTOR2(-60.762f, -66.526f), D3DXVECTOR2(-53.834f, -71.231f),
  69.                            D3DXVECTOR2(-45.89f, -73.977f), D3DXVECTOR2(13.784f, -75.918f), D3DXVECTOR2(22.103f, -74.003f), D3DXVECTOR2(28.424f, -68.345f), 
  70.                            D3DXVECTOR2(32.008f, -60.721f), D3DXVECTOR2(32.969f, -52.331f), D3DXVECTOR2(31.777f, -44.109f), D3DXVECTOR2(28.054f, -36.428f), 
  71.                            D3DXVECTOR2(21.441f, -31.122f), D3DXVECTOR2(13.529f, -28.57f), D3DXVECTOR2(5.153f, -28.072f), D3DXVECTOR2(-3.018f, -30.543f),
  72.                            D3DXVECTOR2(-7.975f, -37.213f), D3DXVECTOR2(-12.147f, -44.651f), D3DXVECTOR2(-17.197f, -50.976f), D3DXVECTOR2(-25.131f, -54.126f), 
  73.                            D3DXVECTOR2(-33.395f, -53.507f), D3DXVECTOR2(-41.168f, -50.853f), D3DXVECTOR2(-46.317f, -44.045f), D3DXVECTOR2(-47.582f, -35.874f), 
  74.                            D3DXVECTOR2(-47.26f, -27.425f), D3DXVECTOR2(-44.497f, -19.349f), D3DXVECTOR2(-39.651f, -12.716f), D3DXVECTOR2(-32.743f, -7.802f), 
  75.                            D3DXVECTOR2(-24.947f, -4.325f), D3DXVECTOR2(-17.018f, -1.44f), D3DXVECTOR2(-8.484f, -1.247f)};
  76.  
  77. D3DXVECTOR3 trackCenter = D3DXVECTOR3(-10.0f, 0.0f, -60.0f);
  78.  
  79. void OBJECT::Update(float deltaTime)
  80. {
  81.     float distance = D3DXVec2Length(&(wayPoints[m_activeWP] - wayPoints[m_nextWP]));
  82.     m_prc += (deltaTime * m_speed) / distance;
  83.  
  84.     if(m_prc >= 1.0f)
  85.     {
  86.         m_prc -= 1.0f;
  87.         m_activeWP++;
  88.         if(m_activeWP > 54)m_activeWP = 0;
  89.  
  90.         m_nextWP = m_activeWP + 1;        
  91.         if(m_nextWP > 54)m_nextWP = 0;
  92.     }
  93.  
  94.     D3DXVECTOR3 a = D3DXVECTOR3(wayPoints[m_activeWP].x, 0.0f, wayPoints[m_activeWP].y);
  95.     D3DXVECTOR3 b = D3DXVECTOR3(wayPoints[m_nextWP].x, 0.0f, wayPoints[m_nextWP].y);
  96.  
  97.     //Linear interpolation between the waypoints
  98.     m_meshInstance.m_pos = a - (a*m_prc) + (b*m_prc);
  99.     m_direction = b - a;
  100.     D3DXVec3Normalize(&m_direction, &m_direction);
  101.  
  102.     //Offset car from track
  103.     D3DXVECTOR3 dirCenter = m_meshInstance.m_pos - trackCenter;
  104.     D3DXVec3Normalize(&dirCenter, &dirCenter);
  105.     m_meshInstance.m_pos += dirCenter * m_offset;
  106.  
  107.     //Calculate the rotation angle
  108.     float angle = 0.0f;
  109.     if(wayPoints[m_activeWP].x - wayPoints[m_nextWP].x != 0.0f)
  110.     {
  111.         float f1 = wayPoints[m_nextWP].y - wayPoints[m_activeWP].y;
  112.         float f2 = wayPoints[m_nextWP].x - wayPoints[m_activeWP].x;
  113.         angle = atan(f1 / -f2);
  114.         if(f2 < 0.0f)angle -= D3DX_PI;
  115.     }
  116.     
  117.     m_meshInstance.m_rot.y = angle;
  118. }
  119.  
  120. void OBJECT::UpdateCameras()
  121. {
  122.     //Camera 1:        Driver's Head
  123.     m_cameras[0].m_eye = m_meshInstance.m_pos + m_direction * -4.0f + D3DXVECTOR3(0.0f, 1.5f, -1.0f);
  124.     m_cameras[0].m_focus = m_meshInstance.m_pos + m_direction * 1.0f + D3DXVECTOR3(0.0f, 1.0f, 0.0f);
  125.     m_cameras[0].m_fov = D3DX_PI * 0.3f;
  126.  
  127.     //Camera 2:        Track Center
  128.     m_cameras[1].m_eye = trackCenter + D3DXVECTOR3(0.0f, 50.0f, 0.0f);
  129.     m_cameras[1].m_focus = m_meshInstance.m_pos;
  130.     m_cameras[1].m_fov = D3DX_PI * 0.1f;
  131.  
  132.     //Camera 3:        In front of the car
  133.     m_cameras[2].m_eye = m_meshInstance.m_pos + m_direction * 5.0f + D3DXVECTOR3(0.0f, 0.3f, 0.0f);
  134.     m_cameras[2].m_focus = m_meshInstance.m_pos + D3DXVECTOR3(0.0f, 1.0f, 0.0f);
  135.     m_cameras[2].m_fov = D3DX_PI * 0.2f;
  136.  
  137.     m_meshInstance.m_pMesh->m_pDevice->SetTransform(D3DTS_VIEW, &m_cameras[m_activeCam].GetViewMatrix());
  138.     m_meshInstance.m_pMesh->m_pDevice->SetTransform(D3DTS_PROJECTION, &m_cameras[m_activeCam].GetProjectionMatrix());
  139. }
  140.  
  141. void OBJECT::Render()
  142. {
  143.     m_meshInstance.Render();
  144. }